//
// Created by 啊汤哥 on 2025/6/23.
//
#include <stdio.h>
#include <stdlib.h>

// typedef struct LNode {
//     int data;
//     LNode *next;
// }LNode, *LinkList;
//
// // 初始
// bool InitList(LinkList &L) {
//     L = (LNode*)malloc(sizeof(LNode));
//     if (L==NULL) {
//         return false;
//     }
//     L->next = L;
//     return true;
// }
//
// // 判断链表是否为尾结点
// bool isTailNode(LinkList L, LNode *p) {
//     if (p->next ==  L) {
//         return true;
//     }
//     return false;
// }
typedef struct DNode {
    int data;
    DNode *next,*pre;
}DNode, *LinkList;

// 初始
bool InitDList(LinkList &L) {
    L = (DNode*)malloc(sizeof(DNode));
    if (L==NULL) {
        return false;
    }
    L->next = L;
    L->pre = L; // 指向头节点
    return true;
}

// 判断链表是否为尾结点
bool isTailNode(LinkList L, DNode *p) {
    if (p->next ==  L) {
        return true;
    }
    return false;
}

// 判断循序单链表是否为空
bool Empty(LinkList L) {
    if (L->next == L) {
        return true;
    }
    return false;
}


// 在双向链表头部插入新节点
bool InsertAtHead(LinkList &L, int value) {
    // 创建新节点
    DNode *newNode = new DNode;
    // 检查内存分配是否成功
    if (newNode == nullptr) {
        // 如果内存分配失败，返回 false
        return false;
    }
    // 设置新节点的数据
    newNode->data = value;
    // 设置新节点的 next 指针指向原头节点的下一个节点
    newNode->next = L->next;
    // 设置新节点的 pre 指针指向头节点
    newNode->pre = L;
    // 更新原头节点下一个节点的 pre 指针指向新节点
    L->next->pre = newNode;
    // 更新头节点的 next 指针指向新节点
    L->next = newNode;
    // 插入成功，返回 true
    return true;
}
// 删除头节点后的第一个节点

bool DeleteAfterHead(LinkList &L) {
    if (Empty(L)) {
        return false; // 链表为空，无法删除
    }

    DNode *p = L->next;  // 要删除的节点
    if (isTailNode(L,p)) {
        return false; // 只有一个头节点，无法删除
    }
    L->next = p->next; // 更新头节点的 next 指针
    p->next->pre = L; // 更新被删除节点后一个节点的 pre 指针
    delete p;    // 释放被删除节点的内存
    return true;
}


// 删除指定节点后的节点

bool DeleteAfterNode(DNode *p) {
    // 指定节点为空或其后没有节点，无法删除
    if (p == nullptr || p->next == nullptr) {
        return false;
    }
    // 要删除的节点
    DNode *delNode = p->next;
    p->next = delNode->next;
    if (delNode->next != nullptr) {
        delNode->next->pre = p; // 更新被删除节点后一个节点的 pre 指针
    }
    delete delNode;  // 释放被删除节点的内存
    return true;
}

